let http = require('http')
let path = require('path')
let url = require('url')
let fs = require('fs')
let mime = require('mime')
let {promisify} = require('util')
// 把一个异步方法转成一个返回promise的方法
let stat = promisify(fs.stat)
let zlib = require('zlib')
/**
 * 客户端向服务器发送请求的时候，会告诉服务器客户端解压的格式
 * Accept-Encoding: gzip, deflate
 */
http.createServer(request).listen(8080)
/**
 * rs.pipe(res)
 * 内部实现
 * rs.on('data', function(data){res.write(data)})
 */
async function request(req, res){
    let {pathname} = url.parse(req.url)
    let filepath = path.join(__dirname, pathname)
    try{
        let statObj = await stat(filepath);
        // 可以根据不同的文件类型，返回不同的content-type
        res.setHeader('Content-Type', mime.getType(pathname))
        // 为了兼容不同浏览器，node把所有请求头全部小写
        let acceptEncoding = req.headers['accept-encoding'];
        // 内容协商
        if(acceptEncoding){
            if(acceptEncoding.match(/\bgzip\b/)){
                // 服务器告诉客户端压缩方式
                res.setHeader("Content-Encoding", 'gzip')
                fs.createReadStream(filepath)
                    .pipe(zlib.createGzip())
                    .pipe(res)
            } else if(acceptEncoding.match(/\bdeflate\b/)){
                res.setHeader("Content-Encoding", 'deflate')
                fs.createReadStream(filepath)
                    .pipe(zlib.createDeflate())
                    .pipe(res)
            } else{
                fs.createReadStream(filepath).pipe(res) 
            }
        } else {
            fs.createReadStream(filepath).pipe(res)
        }
        
    } catch(e){
        res.statusCode = 404;
        res.end()
    }
    
}
